From c4d5503df675daf4c18127a6696ba66e72011574 Mon Sep 17 00:00:00 2001 From: "iap10@labyrinth.cl.cam.ac.uk" Date: Thu, 20 Feb 2003 12:01:18 +0000 Subject: [PATCH] bitkeeper revision 1.64.1.1 (3e54c38ebC53Nz1rWkbaiI8fc1aa6g) Add performance counters. Change keyboard handler keys Hit 'p' to print performance counters Hit 'R' to reboot rather than 'r' Hit 'F1' to toggle keyboard echo --- .rootkeys | 3 ++ xen-2.4.16/common/keyhandler.c | 5 +- xen-2.4.16/common/perfc.c | 81 ++++++++++++++++++++++++++++ xen-2.4.16/drivers/block/xen_block.c | 4 ++ xen-2.4.16/drivers/char/xen_kbd.c | 7 ++- xen-2.4.16/include/xeno/perfc.h | 43 +++++++++++++++ xen-2.4.16/include/xeno/perfc_defn.h | 4 ++ 7 files changed, 145 insertions(+), 2 deletions(-) create mode 100644 xen-2.4.16/common/perfc.c create mode 100644 xen-2.4.16/include/xeno/perfc.h create mode 100644 xen-2.4.16/include/xeno/perfc_defn.h diff --git a/.rootkeys b/.rootkeys index 98a3bb18a8..43a8ca224e 100644 --- a/.rootkeys +++ b/.rootkeys @@ -58,6 +58,7 @@ 3ddb79bdS39UXxUtZnaScie83-7VTQ xen-2.4.16/common/memory.c 3ddb79bdN51qpRC-6bOH-v5hl_AK6A xen-2.4.16/common/network.c 3ddb79bdD4SLmmdMD7yLW5HcUWucXw xen-2.4.16/common/page_alloc.c +3e54c38dkHAev597bPr71-hGzTdocg xen-2.4.16/common/perfc.c 3ddb79bdHqdQpATqC0rmUZNbsb6L6A xen-2.4.16/common/resource.c 3e397e6619PgAfBbw2XFbXkewvUWgw xen-2.4.16/common/schedule.c 3ddb79bdB9RNMnkQnUyZ5C9hhMSQQw xen-2.4.16/common/slab.c @@ -241,6 +242,8 @@ 3e4540ccaugeWGdOuphJKj6WFw1jkw xen-2.4.16/include/xeno/notifier.h 3ddb79c2Fg44_PBPVxHSC0gTOMq4Ow xen-2.4.16/include/xeno/pci.h 3ddb79c0MOVXq8qZDQRGb6z64_xAwg xen-2.4.16/include/xeno/pci_ids.h +3e54c38dlSCVdyVM4PKcrSfzLLxWUQ xen-2.4.16/include/xeno/perfc.h +3e54c38de9SUSYSAwxDf_DwkpAnQFA xen-2.4.16/include/xeno/perfc_defn.h 3ddb79c2byJwwNNkiES__A9H4Cvc4g xen-2.4.16/include/xeno/pkt_sched.h 3ddb79c04nQVR3EYM5L4zxDV_MCo1g xen-2.4.16/include/xeno/prefetch.h 3e4540ccU1sgCx8seIMGlahmMfv7yQ xen-2.4.16/include/xeno/reboot.h diff --git a/xen-2.4.16/common/keyhandler.c b/xen-2.4.16/common/keyhandler.c index 6adc67ec63..dcd1daa564 100644 --- a/xen-2.4.16/common/keyhandler.c +++ b/xen-2.4.16/common/keyhandler.c @@ -1,6 +1,8 @@ #include #include +extern void perfc_printall (u_char key, void *dev_id, struct pt_regs *regs); + #define KEY_MAX 256 #define STR_MAX 64 @@ -120,8 +122,9 @@ void initialize_keytable() /* setup own handlers */ add_key_handler('d', dump_registers, "dump registers"); add_key_handler('h', show_handlers, "show this message"); + add_key_handler('p', perfc_printall, "print performance counters"); add_key_handler('q', do_task_queues, "dump task queues + guest state"); - add_key_handler('r', halt_machine, "reboot machine ungracefully"); + add_key_handler('R', halt_machine, "reboot machine ungracefully"); return; } diff --git a/xen-2.4.16/common/perfc.c b/xen-2.4.16/common/perfc.c new file mode 100644 index 0000000000..07bacc717a --- /dev/null +++ b/xen-2.4.16/common/perfc.c @@ -0,0 +1,81 @@ +/* + * xen performance counters + */ + +#include +#include + +#define PERFCOUNTER( var, name ) "[0]"name"\0", +#define PERFCOUNTER_ARRAY( var, name, size ) "["#size"]"name"\0", + +char* perfc_name[] = { +#include +}; + +struct perfcounter_t perfcounters; + +void __perfc_print (unsigned long counter[], int offset) +{ + int loop; + int total_size = 0; + int element_size = 0; + int num; + + for (loop = 0; loop < sizeof(perfc_name) / sizeof(char *); loop++) + { + num = sscanf (perfc_name[loop], "[%d]", &element_size); + total_size += element_size == 0 ? 1 : element_size; + if (total_size > offset) break; + } + if (loop == sizeof(perfc_name) / sizeof(char *)) + { + printf ("error: couldn't find variable\n"); + return; + } + if (element_size == 0) /* single counter */ + { + printf ("%10ld 0x%08lx %s\n", counter[0], counter[0], + perfc_name[loop] + 2 + num); + } + else /* show entire array */ + { + for (loop = 0; loop < element_size; loop++) + { + printf ("%10ld 0x%08lx %s:%d\n", + counter[loop], counter[loop], + perfc_name[loop] + 2 + num, loop); + } + } + return; +} + +void perfc_printall (u_char key, void *dev_id, struct pt_regs *regs) +{ + int loop, idx; + int element_size; + int num; + unsigned long *counters = (unsigned long *)&perfcounters; + + printf ("xen performance counters\n"); + for (loop = 0; loop < sizeof(perfc_name) / sizeof(char *); loop++) + { + num = sscanf (perfc_name[loop], "[%d]", &element_size); + + for (idx = 0; idx < (element_size ? element_size : 1); idx++) + { + if (element_size) + { + printf ("%10ld 0x%08lx %s:%d\n", + *counters, *counters, perfc_name[loop] + num + 2, idx); + } + else + { + printf ("%10ld 0x%08lx %s\n", + *counters, *counters, perfc_name[loop] + num + 2); + } + counters++; + } + } + + return; +} diff --git a/xen-2.4.16/drivers/block/xen_block.c b/xen-2.4.16/drivers/block/xen_block.c index 449eefe6a7..2b37afdd5f 100644 --- a/xen-2.4.16/drivers/block/xen_block.c +++ b/xen-2.4.16/drivers/block/xen_block.c @@ -14,6 +14,7 @@ #include #include #include +#include /* performance counters */ #include @@ -118,6 +119,8 @@ void flush_blk_queue(void) blk_request = list_entry(io_done_queue.next, blk_request_t, queue); list_del (&blk_request->queue); spin_unlock_irqrestore(&io_done_queue_lock, flags); + + perf_incr(blockio_rx); /* place on ring for guest os */ blk_ring = blk_request->domain->blk_ring_base; @@ -211,6 +214,7 @@ long do_block_io_op_domain (struct task_struct* task) loop != blk_ring->btx_prod; loop = BLK_TX_RING_INC(loop)) { + perf_incr(blockio_tx); status = 1; switch (blk_ring->btx_ring[loop].operation) { diff --git a/xen-2.4.16/drivers/char/xen_kbd.c b/xen-2.4.16/drivers/char/xen_kbd.c index ce8340e7bb..dc9379a06c 100644 --- a/xen-2.4.16/drivers/char/xen_kbd.c +++ b/xen-2.4.16/drivers/char/xen_kbd.c @@ -25,6 +25,7 @@ static int keyboard_shift = 0; static int keyboard_control = 0; +static int keyboard_echo = 0; /* the following is pretty gross... * stop reading if you don't want to throw up! @@ -107,6 +108,10 @@ static unsigned char convert_scancode (unsigned char scancode) switch (scancode) { + case 0xbb: /* F1 */ + keyboard_echo = !keyboard_echo; + break; + case 0xba: /* caps lock UP */ case 0x9d: /* ctrl (left) UP */ keyboard_control = 0; @@ -137,7 +142,7 @@ static unsigned char convert_scancode (unsigned char scancode) } - if (value) printk ("%c", value); + if (value && keyboard_echo) printk ("%c", value); return value; } diff --git a/xen-2.4.16/include/xeno/perfc.h b/xen-2.4.16/include/xeno/perfc.h new file mode 100644 index 0000000000..31201eaa6d --- /dev/null +++ b/xen-2.4.16/include/xeno/perfc.h @@ -0,0 +1,43 @@ +/* + * xen performance counters + */ + +/* + * NOTE: new counters must be defined in xen_perf_defn.h + * + * PERFCOUNTER (counter, string) define a new performance counter + * PERFCOUNTER_ARRY (counter, string, size) define an array of counters + * + * unsigned long perfc_value (counter) get value of a counter + * unsigned long perfc_valuea (counter, index) get value of an array counter + * void perfc_incr (counter) increment a counter + * void perfc_incra (counter, index) increment an array counter + * void perfc_add (counter, value) add a value to a counter + * void perfc_adda (counter, index, value) add a value to array counter + * void perfc_print (counter) print out the counter + */ + +#define PERFCOUNTER( var, name ) \ +unsigned long var[1]; +#define PERFCOUNTER_ARRAY( var, name, size ) \ +unsigned long var[size]; + +struct perfcounter_t +{ +#include +}; + +extern struct perfcounter_t perfcounters; +extern char *perfc_name[]; + +#define perf_value(x) perfcounters.x[0] +#define perf_valuea(x,y) perfcounters.x[y] +#define perf_incr(x) perfcounters.x[0]++ +#define perf_incra(x,y) perfcounters.x[y]++ +#define perf_add(x,y) perfcounters.x[0]+=(y) +#define perf_adda(x,y,z) perfcounters.x[y]+=(z) + +#define perf_print(x) \ + __perfc_print(perfcounters.x, \ + &perfcounters.x[0] - ((unsigned long *)&perfcounters)) + diff --git a/xen-2.4.16/include/xeno/perfc_defn.h b/xen-2.4.16/include/xeno/perfc_defn.h new file mode 100644 index 0000000000..16ab4cd8c9 --- /dev/null +++ b/xen-2.4.16/include/xeno/perfc_defn.h @@ -0,0 +1,4 @@ + +PERFCOUNTER( blockio_tx, "block io: messages received from tx queue" ) +PERFCOUNTER( blockio_rx, "block io: messages sent on rx queue" ) + -- 2.30.2